SpringBoot整合Flowable工作流之流程部署

您所在的位置:网站首页 flowable启动流程 成功回调 SpringBoot整合Flowable工作流之流程部署

SpringBoot整合Flowable工作流之流程部署

2024-02-02 14:08| 来源: 网络整理| 查看: 265

目录 1. 流程的部署1.1. `Flowable` 默认的部署1.2. `Flowable` 的动态部署 2. `SpringBoot` 整合 `Flowable`2.1. 添加相关依赖2.2. 添加对应的配置 3. 案例应用3.1. 流程部署3.2. 流程部署表分析3.2.1. `act_re_deployment` 表 3.2.2. `act_re_procdef` 表3.2.3. `act_ge_bytearray` 表

1. 流程的部署 1.1. Flowable 默认的部署

默认情况下,我们放在 resources/processes 目录下的所有流程文件会自动被部署,流程文件的后缀有两种形式 bpmn20.xml 或者 bpmn。当然,无论是存放流程文件的位置,还是流程文件的格式,都是可以定制的,涉及到的属性主要有三个,可在 application.properties 中进行配置

flowable.check-process-definitions=false flowable.process-definition-location-prefix=classpath*:/processes/ flowable.process-definition-location-suffixes=**.bpmn20.xml,**.bpmn flowable.check-process-definitions:表示在项目启动的时候,去检查文件目录是否有对应的流程文件,默认值为 true 表示如果有流程文件就自动部署,false 表示不检查,那么也就不会自动部署flowable.process-definition-location-prefix:这个是流程文件的位置,默认就是 classpath*:/processes/,当然开发者也可以进行配置flowable.process-definition-location-suffixes:这个是流程文件的后缀,默认有两个,分别是 **.bpmn20.xml 和 **.bpmn,当然开发者也可以进行配置 1.2. Flowable 的动态部署

有的时候,我们的流程可能并不是提前设计好的,而是项目启动之后,动态部署的,例如项目启动成功之后,动态上传一个流程的 XML 文件进行部署,这也是一种比较常见的场景,对于这种情况,我们可以按照如下方式进行部署

@RestController public class ProcessDeployController { @Autowired RepositoryService repositoryService; @PostMapping("/deploy") public RespBean deploy(MultipartFile file) throws IOException { DeploymentBuilder deploymentBuilder = repositoryService.createDeployment() .category("javaboy的工作流分类") .name("javaboy的工作流名称") .addInputStream(file.getOriginalFilename(), file.getInputStream()) .key("javaboy的工作流key"); Deployment deployment = deploymentBuilder.deploy(); return RespBean.ok("部署成功",deployment.getId()); } } 关键的方法是 addInputStream,通过该方法去指定流程文件。官方提供的指定流程文件的方式有好几种;除了 addInputStream 之外,另外还有一个 addString,这个就是将流程文件转为一个字符串传入进来;addBytes 是将流程文件转为字节数组传进来;addClasspathResource 方法则是直接从 classpath 目录下去加载流程文件,这几个方法根据自己的使用场景选择一个合适的方法去调用即可注意:addInputStream/addBytes/addString 等方法都需要设置资源名,这个名称是可以随意设置的,但是注意名称的后缀,需要是 bpmn20.xml 或者 bpmn,否则流程没有部署 2. SpringBoot 整合 Flowable

关于 Flowable 版本与 SpringBoot 版本对应关系请查看:https://blog.csdn.net/JinYJ2014/article/details/121530632

2.1. 添加相关依赖 org.flowable flowable-spring-boot-starter 6.4.1 org.springframework.boot spring-boot-starter-test test mysql mysql-connector-java 5.1.38 com.alibaba druid-spring-boot-starter 1.1.10 2.2. 添加对应的配置 server.port=8080 #JDBC 配置:MySQL Server 版本为 5.7.39 spring.datasource.druid.url=jdbc:mysql://127.0.0.1:3306/flowable1?characterEncoding=utf8&useSSL=false&autoReconnect=true&serverTimezone=UTC spring.datasource.druid.username=root spring.datasource.druid.password=123456 spring.datasource.druid.driver-class-name=com.mysql.jdbc.Driver spring.datasource.type=com.alibaba.druid.pool.DruidDataSource #druid 连接池配置 spring.datasource.druid.initial-size=3 spring.datasource.druid.min-idle=3 spring.datasource.druid.max-active=10 spring.datasource.druid.max-wait=60000 #关闭定时任务JOB flowable.async-executor-activate=false #当Flowable发现库与数据库表结构不一致时,会自动将数据库表结构升级至新版本 flowable.database-schema-update=true #在项目启动时,去检查文件目录是否有对应的流程文件,默认值为 true 表示如果有流程文件就自动部署,false 表示不检查,那么也就不会自动部署 flowable.check-process-definitions=true #指定工作流程图的位置,默认值 flowable.process-definition-location-prefix=classpath*:/processes/ #指定工作流程图文件的后缀,默认值 flowable.process-definition-location-suffixes=**.bpmn20.xml, **.bpmn #打印 SQL 语句 logging.level.org.flowable.engine.impl.persistence.entity.*=debug logging.level.org.flowable.task.service.impl.persistence.entity.*=debug

系统启动的时候检查如果数据库对应的表结构没有创建,会帮助我们先创建对应的表结构。到此整合就搞定了,非常的简单,然后我们就可以通过案例来测试了

3. 案例应用 3.1. 流程部署

使用 Flowable 默认的部署的方式,即将工作流程图文件放在 resources/processes 目录下,这样它会被自动部署

在这里插入图片描述 我们可以从容器中直接获取相关的对象,ProcessEngine,RuntimeService 等

@SpringBootTest @RunWith(value = SpringRunner.class) public class AppTest { @Autowired private RepositoryService repositoryService; @Test public void shouldAnswerWithTrue() { // ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); // RepositoryService repositoryService = processEngine.getRepositoryService(); Deployment deploy = repositoryService.createDeployment() .addClasspathResource("processes/MyLeaveProcessOne.bpmn20.xml") .name("员工请假流程") .category("请假")// 分类 .tenantId("user1Id")// 租户id .deploy(); System.out.println("deploy.getId() = " + deploy.getId()); System.out.println("deploy.getName() = " + deploy.getName()); System.out.println("deploy.getCategory() = " + deploy.getCategory()); } }

运行结果,说明流程部署成功

在这里插入图片描述

3.2. 流程部署表分析

流程部署完毕之后,会得到这 70 张表,Flowable 版本是 6.4.1

在这里插入图片描述

在我们的流程部署过程中,一共有三张表参与到我们的工作中了

3.2.1. act_re_deployment 表

这个表是流程部署表,每部署一个流程,这张表中就会新增一条记录,用来描述我们刚刚定义好的流程

在这里插入图片描述 这里的 ID_、NAME_、CATEGORY_ 等等,就是我们在部署流程的时候设置的参数

字段名称备注ID_主键NAME_名称CATEGORY_分类TENANT_ID_租户IDDEPLOY_TIME_部署时间DERIVED_FROM_来源于DERIVED_FROM_ROOT_来源于ENGINE_VERSION_流程引擎的版本 3.2.2. act_re_procdef 表

这是流程定义表,我们每定义的一个流程,都会记录在这张表中

在这里插入图片描述

这张表中的字段比较多,我这里只是列出来了其中一部分。表中有一个 DEPLOYMENT_ID 字段和 act_re_deployment 表进行了关联,所以 act_re_deployment 和 act_re_procdef 表的关系,其实是一对一的关系,部署表中的一条记录对应流程定义表中的一条记录另外,该表中有一个 CATEGORY_ 的字段,这个字段表示流程的分类,注意这个和部署的分类可不一样,流程的分类,说白了其实就是我们流程定义 XML 文件中的 targetNamespace 属性另外,该表中还有一个 VERSION_ 字段,这个看名字就知道是描述记录的版本号,当我们修改了流程的内容之后,重新部署的时候,act_re_deployment 和 act_re_procdef 表均会自动增加一条记录数;其中流程定义表 act_re_procdef 中的记录的 VERSION_ 字段的值会自动加 1,这样我们就能够看到不同历史版本的流程定义 字段名称备注ID_主键REV_版本号CATEGORY_分类流程定义的Namespace就是类别NAME_名称KEY_标识VERSION_版本DEPLOYMENT_ID_部署IDRESOURCE_NAME_资源名称流程bpmn文件名称DGRM_RESOURCE_NAME_图片资源名称DESCRIPTION_描述HAS_START_FORM_KEY_拥有开始表单标识start节点是否存在formKey 0否 1是HAS_GRAPHICAL_NOTATION_拥有图形信息SUSPENSION_STATE_挂起状态暂停状态 1激活 2暂停TENANT_ID_租户ID 3.2.3. act_ge_bytearray 表

涉及到的第三张表是这个通用数据存储表,这个表的字段比较少

在这里插入图片描述 这个表中有一个 DEPLOYMENT_ID 字段,这个就是跟 act_re_deployment 表关联的字段,一条流程部署记录在 act_ge_bytearray 表中对应两条记录,分别是记录 XML 文件和记录流程图片

这个表中有一个 BYTES_ 字段,我们部署的流程的 XML 文件就保存在这里,同时,系统默认还会根据 XML 文件生成一张流程图片,也保存在这里

字段名称备注ID_主键REV_版本号NAME_名称部署的文件名称,如:holiday-request-new.bpmn20.xml、holiday-request-new.bpmn20.pngDEPLOYMENT_ID_部署IDBYTES_字节(二进制数据)GENERATED_是否系统生成0为用户上传,1为系统自动生成, 比如系统会 自动根据xml生 成png


【本文地址】


今日新闻


推荐新闻


    CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3